// 引入axios
import axios from 'axios'
// 引入qs模块，对数据进行序列化
import QS from 'qs'
//引入cookie
import cookies from '../utils/cookieTool'
// import { router } from "@/router"
// const Vroute = router.currentRoute.value

// 请求超时时间
//axios.defaults.timeout = 10000
// request.js
// 创建新的axios实例
const service = axios.create({
    // 环境变量，需要在.env文件中配置
    baseURL: '/api',
    //baseURL: import.meta.env.VITE_API,
    // 超时时间暂定5s
    timeout: 7000,
});

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
        // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
        // console.log(config.url.includes('/Login'))
        let token = cookies.getCookie('token')

        token && !config.url.includes('/Login') && (config.headers.Authorization = `Bearer ${token}`)

        if (config.method.toUpperCase() === 'POST' && config.headers['Content-Type'] != 'multipart/form-data') {
            config.headers['Content-Type'] = 'application/json;charset=utf-8'
        }
        return config
    },
    error => {
        return Promise.error(error)
    })
// 响应拦截器
service.interceptors.response.use(
    response => {
        if (response.status === 200) {
            switch (response.data.code) {
                case 500:
                    window.$message.error(response.data.message)
                    break
            }
            return Promise.resolve(response)
        } else {
            return Promise.reject(response)
        }
    },
    // 服务器状态码不是200的情况
    error => {
        if (error.request.status) {

            switch (error.request.status) {
                case 500:
                    window.$message.error('网错错误，请稍后再试！')
                    break
                case 404:
                    window.$message.error('网错错误，请稍后再试！')
                    break
                case 401:
                    window.$message.error('登录已过期，请重新登录！')
                    break;
                // 其他错误，直接抛出错误提示
                default:
                    window.$message.error(error.message)
                    break;
            }
            return Promise.reject(error.response)
        }
    }
)

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function get(url, params) {
    return new Promise((resolve, reject) => {
        service.get(url, {
            params: params
        })
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}
/**
* post方法，对应post请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
function post(url, params) {
    return new Promise((resolve, reject) => {
        console.log(QS.parse(params))
        service.post(url, QS.parse(params))
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}
/**
* post方法，对应post请求 JSON序列化
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
function postList(url, params) {
    return new Promise((resolve, reject) => {
        service.post(url, JSON.stringify(params))
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}
/**
 * get方法，对应get请求,直接在地址后面拼串的形式
 * @param {String} url [请求的url地址]
 * @param {String} params [请求时携带的参数]
 */
function getDynamicynamic(url, params) {
    return new Promise((resolve, reject) => {
        const completeUrl = `${url}/${params}`
        service.get(completeUrl, {})
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                reject(err.data)
            })
    })
}
/**
 * post方法，导出文件
 * @param {String} url [请求的url地址]
 * @param {String} params [请求时携带的参数]
 */
function getFileUseBlobByPost(url, params = {}) {
    return new Promise((resolve, reject) => {
        service({
            method: 'post',
            url,
            data: params,
            responseType: 'blob'
        })
            .then(res => {
                resolve(res)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}
/**
 * post方法，传递FormData参数
 * @param {String} url [请求的url地址]
 * @param {String} params [请求时携带的参数]
 */
function UploadFileByPostFormData(url, params = {}) {
    return new Promise((resolve, reject) => {
        service({
            method: 'post',
            url,
            data: params,
            // responseType: 'blob',
            headers: {
                'Content-Type': 'multipart/form-data'
            },
        })
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}
/**
* del方法，对应del请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
function del(url, params) {
    console.log(url, params)
    return new Promise((resolve, reject) => {
        service.delete(url, {
            params: params
        })
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                console.log(err)
                reject(err.data)
            })
    })
}


export default {
    get,
    post,
    getFileUseBlobByPost,
    UploadFileByPostFormData,
    postList,
    del
}

